module ds18b20_lcd1602_uart(
    input            sys_clk     ,    //输入的系统时钟
    input            sys_rst_n   ,    //输入的复位信号
    inout            dq          ,    //ds18b20温度传感器单总线
	 output           beep        ,    //蜂鸣器控制管脚
	 input            uart_rxd    ,    //uart接收
	 output           uart_txd    ,    //uart发送
	 //lcd1602
	 output           LCD_EN,RS,RW,LCD_ON,LCD_BLON,
	 output  [7:0]    DB8          //8位指令或数据总线
);
parameter BAUD_RATE = 9600      ;//串口波特率设置
parameter CLK_FREQ  = 50_000_000;//系统时钟频率
//wire define
wire    [19:0] temp_data;           // 温度数值
wire           sign     ;           // 符号位
wire    [19:0] thr_data ;           // 温度数值
wire           thr_sign ;           // 符号位
wire           overflow ;           // 超温告警标准，高有效
wire [3:0]     bcd_d0   ;           // 温度小数百分位
wire [3:0]     bcd_d1   ;           // 温度小数十分位
wire [3:0]     bcd_d2   ;           // 温度个位
wire [3:0]     bcd_d3   ;           // 温度十位
wire [3:0]     bcd_d4   ;           // 温度百位
wire [7:0]     asc_d0   ;           // 温度小数百分位（ASCII码）
wire [7:0]     asc_d1   ;           // 温度小数十分位（ASCII码）
wire [7:0]     asc_d2   ;           // 温度个位（ASCII码）
wire [7:0]     asc_d3   ;           // 温度十位（ASCII码）
wire [7:0]     asc_d4   ;           // 温度百位（ASCII码）
wire [3:0]     thr_bcd_d0   ;       // 温度阈值小数百分位
wire [3:0]     thr_bcd_d1   ;       // 温度阈值小数十分位
wire [3:0]     thr_bcd_d2   ;       // 温度阈值个位
wire [3:0]     thr_bcd_d3   ;       // 温度阈值十位
wire [3:0]     thr_bcd_d4   ;       // 温度阈值百位
wire [7:0]     thr_asc_d0   ;       // 温度阈值小数百分位（ASCII码）
wire [7:0]     thr_asc_d1   ;       // 温度阈值小数十分位（ASCII码）
wire [7:0]     thr_asc_d2   ;       // 温度阈值个位（ASCII码）
wire [7:0]     thr_asc_d3   ;       // 温度阈值十位（ASCII码）
wire [7:0]     thr_asc_d4   ;       // 温度阈值百位（ASCII码）
wire           LCD_clk_w;           //LCD1602驱动模块工作时钟
wire [127:0]   dis_data1_w;         //LCD1602第一行显示的数据,ASCII码
wire [127:0]   dis_data2_w;         //LCD1602第二行显示的数据,ASCII码
wire [7:0]     sign_ascii ;         //温度符号的ASCII码:"+" or "-"
wire [7:0]     thr_sign_ascii ;     //温度阈值符号的ASCII码:"+" or "-"
wire          tx_cmd_valid;
wire  [15:0]  tx_cmd_index;
wire  [31:0]  tx_par_index;
wire          rx_cmd_valid;
wire  [15:0]  rx_cmd_index;
wire  [31:0]  rx_par_index;
//assign语句

//例化DS18B20驱动模块
ds18b20_dri u1_ds18b20_dri(
    //module clock
    .clk          (sys_clk  ),        // 时钟信号（50MHz）
    .rst_n        (sys_rst_n),        // 复位信号
    //user interface
    .dq           (dq       ),        // DS18B20的DQ引脚数据
    .temp_data    (temp_data),        // 转换后得到的温度值
    .sign         (sign     )         // 符号位
);
//串口通信模块
uart_cmd_top#(
	.CLK_FREQ  (CLK_FREQ  ),
	.BAUD_RATE (BAUD_RATE ),
	.PLATFORM  (0         ) //0:Altera 1:Xilinx 2:GoWin 3:Anlogic

)u_uart_cmd_top_0(
    .clk     (sys_clk  ),
    .rst_n   (sys_rst_n),
    .uart_rxd(uart_rxd) ,
    .uart_txd(uart_txd) ,
    //发送指令
    .tx_cmd_valid (tx_cmd_valid),
    .tx_cmd_index (tx_cmd_index),//指令
    .tx_par_index (tx_par_index),//参数
    //接收指令
    .rx_cmd_valid (rx_cmd_valid),
    .rx_cmd_index (rx_cmd_index),//指令
    .rx_par_index (rx_par_index) //参数
);
//串口指令生产/执行模块
cmd_exe u_cmd_exe_0(
    .clk  (sys_clk  ),
    .rst_n(sys_rst_n),
    //发送指令
    .tx_cmd_valid (tx_cmd_valid),
    .tx_cmd_index (tx_cmd_index),//指令
    .tx_par_index (tx_par_index),//参数
    //接收指令
    .rx_cmd_valid (rx_cmd_valid),
    .rx_cmd_index (rx_cmd_index),//指令
    .rx_par_index (rx_par_index),//参数
    //用户接口0:温度上报
    .temp_data    (temp_data   ),// 转换后得到的温度值
    .sign         (sign        ),// 符号位
    //用户接口1:温度阈值
    .thr_data     (thr_data   ),// 转换后得到的温度值
    .thr_sign     (thr_sign   ) // 符号位
);
//超温告警模块
temp_alert u_temp_alert_0(
    .clk50m   (sys_clk  ),
	 .rst_n    (sys_rst_n),
	 .temp_sign(sign     ),//测得的温度的符号
	 .temp     (temp_data),//测得的温度的绝对值
	 .thr_sign (thr_sign ),//温度阈值的符号
	 .thr      (thr_data ),//温度阈值的绝对值
	 .overflow (overflow ) //超温标志，高代表超温
);
//蜂鸣器驱动模块
beep u_beep_0(
       .clk  (sys_clk  ),
		 .rst_n(sys_rst_n),
		 .en   (overflow ),//蜂鸣器使能，高有效
		 .beep (beep     ) //蜂鸣器驱动信号
);
/*********温度转ASCII码************************/
//温度二进制转8421BCD
bin2dec u_bin2dec_0(
	.clk50M (sys_clk  ),
	.rst_n  (sys_rst_n),
	.data_in(temp_data),
	.d0     (bcd_d0),
	.d1     (bcd_d1),
	.d2     (bcd_d2),
	.d3     (bcd_d3),
	.d4     (bcd_d4),
	.d5     (),
	.d6     (),
	.d7     ()
);
//温度BCD码转ASCII码
bcd2ascii u_bcd2ascii_0(
	.d0     (bcd_d0),
	.d1     (bcd_d1),
	.d2     (bcd_d2),
	.d3     (bcd_d3),
	.d4     (bcd_d4),
	.asc_d0 (asc_d0),
	.asc_d1 (asc_d1),
	.asc_d2 (asc_d2),
	.asc_d3 (asc_d3),
	.asc_d4 (asc_d4)
);
//温度符号转ASCIi码
sign2ascii u_sign2ascii_0(
	.sign      (sign      ),
	.sign_ascii(sign_ascii)
);
/*********温度阈值转ASCII码************************/
//温度阈值二进制转8421BCD
bin2dec u_bin2dec_1(
	.clk50M (sys_clk  ),
	.rst_n  (sys_rst_n),
	.data_in(thr_data),
	.d0     (thr_bcd_d0),
	.d1     (thr_bcd_d1),
	.d2     (thr_bcd_d2),
	.d3     (thr_bcd_d3),
	.d4     (thr_bcd_d4),
	.d5     (),
	.d6     (),
	.d7     ()
);
//温度阈值BCD码转ASCII码
bcd2ascii u_bcd2ascii_1(
	.d0     (thr_bcd_d0),
	.d1     (thr_bcd_d1),
	.d2     (thr_bcd_d2),
	.d3     (thr_bcd_d3),
	.d4     (thr_bcd_d4),
	.asc_d0 (thr_asc_d0),
	.asc_d1 (thr_asc_d1),
	.asc_d2 (thr_asc_d2),
	.asc_d3 (thr_asc_d3),
	.asc_d4 (thr_asc_d4)
);
//温度阈值符号转ASCIi码
sign2ascii u_sign2ascii_1(
	.sign      (thr_sign      ),
	.sign_ascii(thr_sign_ascii)
);
//LCD1602驱动模块
lcd1602_content u_lcd1602_content_0(
	.clk50m(sys_clk),
	.rst_n (sys_rst_n),
	.asc_d0(asc_d0),
	.asc_d1(asc_d1),
	.asc_d2(asc_d2),
	.asc_d3(asc_d3),
	.asc_d4(asc_d4),
	.sign_ascii(sign_ascii),
	.thr_asc_d0(thr_asc_d0),
	.thr_asc_d1(thr_asc_d1),
	.thr_asc_d2(thr_asc_d2),
	.thr_asc_d3(thr_asc_d3),
	.thr_asc_d4(thr_asc_d4),
	.thr_sign_ascii(thr_sign_ascii),
	.Data_First(dis_data1_w),
	.Data_Second(dis_data2_w)
);
LCD1602 LCD1602_u(
		  .Data_First (dis_data1_w),
        .Data_Second(dis_data2_w),
        .clk_LCD(LCD_clk_w),
        .rst(sys_rst_n),
        .LCD_EN(LCD_EN),
        .RS(RS),
        .RW(RW),
        .DB8(DB8),
        .LCD_ON(LCD_ON),
        .LCD_BLON(LCD_BLON));
LCD_clk LCD_clk_u(
        .clk50M(sys_clk    ),
        .rst_n (sys_rst_n  ),
        .LCD_clk(LCD_clk_w )
		  );		  
endmodule 